import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例
const service = axios.create({
  baseURL: '/api', // 设置API基础路径前缀
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 从localStorage获取token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    
    // 确保所有请求都使用正确的Content-Type
    if (config.method.toLowerCase() === 'post' || config.method.toLowerCase() === 'put') {
      config.headers['Content-Type'] = 'application/json'
    }
    
    // 确保所有请求都使用POST方法
    if (config.method.toLowerCase() !== 'post') {
      console.warn(`请求方法不是POST: ${config.url}，已自动转换为POST`)
      config.method = 'post'
    }
    
    // 确保data是对象而不是字符串
    if (typeof config.data === 'string') {
      try {
        config.data = JSON.parse(config.data)
      } catch (e) {
        console.error('无法解析请求数据为JSON:', e)
      }
    }
    
    console.log('发送请求:', config.url, config.data)
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    console.log('服务器响应:', res)
    
    // 统一处理响应
    if (res.code === 200) {
      return res
    } else {
      // 显示错误消息
      const errorMessage = res.message || '请求失败'
      ElMessage.error(errorMessage)
      return Promise.reject(new Error(errorMessage))
    }
  },
  error => {
    console.error('响应错误:', error.response?.data || error)
    
    // 处理不同的HTTP错误状态码
    if (error.response) {
      const status = error.response.status
      let errorMessage
      if (status === 401) {
        // 未授权，清除用户信息并重定向到登录页
        localStorage.removeItem('token')
        localStorage.removeItem('userInfo')
        window.location.href = '/login'
        errorMessage = '登录已过期，请重新登录'
      } else if (status === 403) {
        errorMessage = '没有权限访问该资源'
      } else if (status === 404) {
        errorMessage = '请求的资源不存在'
      } else if (status === 500) {
        errorMessage = '服务器内部错误'
      } else {
        errorMessage = error.response?.data?.message || error.message || '请求失败'
      }
      ElMessage.error(errorMessage)
    } else {
      // 网络错误或其他错误
      ElMessage.error('网络错误，请检查您的网络连接')
    }
    
    return Promise.reject(error)
  }
)

export default service
